#!/bin/bash

declare -A IDS
IDS["8086:10fb"]="82599ES PF"
IDS["8086:1583"]="XL710 PF"
IDS["8086:158b"]="XXV710 PF"
IDS["8086:154c"]="XXV710 VF"
IDS["8086:37d1"]="X722 PF"
IDS["8086:37cd"]="X722 VF"
IDS["8086:1889"]="AVF"
IDS["8086:1593"]="E810 PF"
IDS["15b3:1015"]="CX-4 Lx PF"
IDS["15b3:1017"]="CX-5 PF"
IDS["15b3:1019"]="CX-5 Ex PF"

echo "PCI Address  N PCI-ID       Driver    MAC address       Device Name    State Speed      Port Type"
echo "============ = =========== ========== ================= ============== ===== ========== ===================="

for d in /sys/bus/pci/devices/*; do
  class=$(cat $d/class)
  [ "${class}" == "0x020000" ] || continue
  pci_addr=$(basename $d)
  numa=$(cat $d/numa_node)
  vid=$(cat $d/vendor | sed -e s/0x//g)
  did=$(cat $d/device| sed -e s/0x//g)
  pci_id=${IDS[$vid:$did]}

  [ "$pci_id" == "" ] && pci_id="$vid:$did"

  if [ -e $d/driver ] ; then
    driver=$(basename $(readlink $d/driver))
  else
    driver=" "
  fi
  if [ -e $d/net ] ; then
    dev=$(basename $(ls $d/net | head -1))
    n=/sys/class/net/$dev
    mac=$(cat $n/address)
    oper=$(cat $n/operstate)
#    speed=$(sudo ethtool $dev | grep Speed | cut -d" " -f2)
##port=$(ethtool $dev 2> /dev/null | sed -ne 's/.*Port: \(.*\)/\1/p')
  else
    dev=" "
    mac=" "
    oper=" "
    speed=" "
    port=" "
  fi
  printf "%-12s %s %-11s %-10s %-17s %-14s %-5s %-10s %s\n" \
        $pci_addr $numa "$pci_id" $driver $mac $dev $oper $speed "$port"
done
